package services

import (
	"blog-backend/internal/app/dtos"
	"blog-backend/internal/app/models"
	"blog-backend/internal/app/repositories"
	"errors"
	"strings"
)

type PostService struct {
	postRepo     *repositories.PostRepository
	categoryRepo *repositories.CategoryRepository
}

func NewPostService() *PostService {
	return &PostService{
		postRepo:     repositories.NewPostRepository(),
		categoryRepo: repositories.NewCategoryRepository(),
	}
}

// GetPosts 获取文章列表（分页）
func (s *PostService) GetPosts(page, limit int) ([]models.Post, int64, error) {
	if page < 1 {
		page = 1
	}
	if limit < 1 {
		limit = 10
	}
	
	offset := (page - 1) * limit
	return s.postRepo.GetPublishedPosts(offset, limit)
}

// GetPost 获取单篇文章
func (s *PostService) GetPost(id uint) (*models.Post, error) {
	post, err := s.postRepo.GetByID(id)
	if err != nil {
		return nil, errors.New("文章不存在")
	}
	
	// 增加浏览量
	s.postRepo.IncrementViewCount(id)
	
	return post, nil
}

// GetPostBySlug 通过Slug获取文章
func (s *PostService) GetPostBySlug(slug string) (*models.Post, error) {
	post, err := s.postRepo.GetBySlug(slug)
	if err != nil {
		return nil, errors.New("文章不存在")
	}
	
	// 增加浏览量
	s.postRepo.IncrementViewCount(post.ID)
	
	return post, nil
}

// CreatePost 创建新文章
func (s *PostService) CreatePost(dto dtos.CreatePostDto, userID uint) (*models.Post, error) {
	// 检查分类是否存在
	if !s.categoryRepo.Exists(dto.CategoryID) {
		return nil, errors.New("分类不存在")
	}
	
	// 检查Slug是否唯一
	if s.postRepo.SlugExists(dto.Slug) {
		return nil, errors.New("URL标识已被使用")
	}
	
	// 生成摘要
	excerpt := dto.Excerpt
	if excerpt == "" {
		excerpt = generateExcerpt(dto.Content, 150)
	}
	
	post := &models.Post{
		Title:      dto.Title,
		Slug:       dto.Slug,
		Content:    dto.Content,
		Excerpt:    excerpt,
		UserID:     userID,
		CategoryID: dto.CategoryID,
		Status:     1, // 默认发布
	}
	
	if err := s.postRepo.Create(post); err != nil {
		return nil, errors.New("创建文章失败")
	}
	
	return post, nil
}

// UpdatePost 更新文章
func (s *PostService) UpdatePost(id uint, dto dtos.UpdatePostDto, userID uint) (*models.Post, error) {
	post, err := s.postRepo.GetByID(id)
	if err != nil {
		return nil, errors.New("文章不存在")
	}
	
	// 检查用户是否有权限修改
	if post.UserID != userID {
		return nil, errors.New("无权修改此文章")
	}
	
	// 更新基本信息
	if dto.Title != "" {
		post.Title = dto.Title
	}
	
	if dto.Slug != "" && dto.Slug != post.Slug {
		if s.postRepo.SlugExists(dto.Slug) {
			return nil, errors.New("URL标识已被使用")
		}
		post.Slug = dto.Slug
	}
	
	if dto.Content != "" {
		post.Content = dto.Content
	}
	
	if dto.Excerpt != "" {
		post.Excerpt = dto.Excerpt
	} else if dto.Content != "" {
		post.Excerpt = generateExcerpt(dto.Content, 150)
	}
	
	if dto.CategoryID != 0 && dto.CategoryID != post.CategoryID {
		if !s.categoryRepo.Exists(dto.CategoryID) {
			return nil, errors.New("分类不存在")
		}
		post.CategoryID = dto.CategoryID
	}
	
	if dto.Status != post.Status {
		post.Status = dto.Status
	}
	
	if err := s.postRepo.Update(post); err != nil {
		return nil, errors.New("更新文章失败")
	}
	
	return post, nil
}

// DeletePost 删除文章
func (s *PostService) DeletePost(id uint, userID uint) error {
	post, err := s.postRepo.GetByID(id)
	if err != nil {
		return errors.New("文章不存在")
	}
	
	// 检查用户是否有权限删除
	if post.UserID != userID {
		return errors.New("无权删除此文章")
	}
	
	if err := s.postRepo.Delete(id); err != nil {
		return errors.New("删除文章失败")
	}
	
	return nil
}

// generateExcerpt 从内容生成摘要
func generateExcerpt(content string, maxLength int) string {
	// 去除Markdown标记
	plainText := content
	plainText = strings.ReplaceAll(plainText, "#", "")
	plainText = strings.ReplaceAll(plainText, "**", "")
	plainText = strings.ReplaceAll(plainText, "__", "")
	plainText = strings.ReplaceAll(plainText, "`", "")
	plainText = strings.ReplaceAll(plainText, ">", "")
	
	// 截取指定长度
	if len(plainText) > maxLength {
		plainText = plainText[:maxLength] + "..."
	}
	
	return plainText
}